import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import dts from 'vite-plugin-dts'

// https://vitejs.dev/config/
// 这个配置文件现在只关心如何将框架构建为一个库 (library mode)。
// 所有关于 serve (开发服务器) 和 example (示例) 的配置都已被移除，
// 它们应该由使用本框架的子项目 (如 axiom-view-demo) 自己来定义。
export default defineConfig({
  plugins: [
    vue({
      isProduction: true,
    }),
    dts({
      insertTypesEntry: true,
      copyDtsFiles: false,
    }),
  ],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src'),
    }
  },
  build: {
    lib: {
      entry: resolve(__dirname, 'src/index.js'),
      name: 'AxiomView',
      fileName: (format) => `axiom-view.${format}.js`,
      formats: ['es', 'umd']
    },
    rollupOptions: {
      // 确保外部化处理不想打包进库的依赖
      external: [
        'vue',
        'vue-router',
        'element-plus',
        '@element-plus/icons-vue',
        'pinia',
        'axios',
        'chart.js',
        'echarts',
        /^element-plus\/.*/,
      ],
      output: {
        // 在 UMD 构建模式下为这些外部化的依赖提供全局变量
        globals: {
          vue: 'Vue',
          'vue-router': 'VueRouter',
          'element-plus': 'ElementPlus',
          '@element-plus/icons-vue': 'ElementPlusIconsVue',
          pinia: 'Pinia',
          axios: 'axios',
          'chart.js': 'Chart',
          echarts: 'echarts'
        },
        exports: 'named',
        assetFileNames: (assetInfo) => {
          if (assetInfo.name && assetInfo.name.endsWith('.css')) {
            return 'style.css'
          }
          return assetInfo.name
        }
      }
    },
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
        pure_funcs: ['console.log', 'console.info', 'console.debug'],
        passes: 2
      },
      mangle: {
        toplevel: true
      }
    },
    cssCodeSplit: false,
    sourcemap: false,
    target: 'es2015',
    outDir: 'dist',
    emptyOutDir: true,
    chunkSizeWarningLimit: 1000
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@use "@/styles/variables.scss" as *;`,
        outputStyle: 'compressed',
      }
    },
  },
  // 优化依赖预构建
  optimizeDeps: {
    exclude: ['vue', 'vue-router', 'element-plus', 'pinia']
  },
})